#pragma once

#include "Game/Scene/GameScene.h"
#include "Game/Process/CoordinateProcess.h"

#include "Render/Imgui/imgui.h"
#include "Render/Imgui/ImGuizmo.h"

#include "LocalProcess.h"
#include "GBufferProcess.h"
#include "ResourceProcess.h"

class ShadowsRayTraceProcess;
class ShadowsTemporalAccumulationProcess;
class ShadowsAtrousFilterProcess;
class AoRayTraceProcess;
class AoTemporalAccumulationProcess;
class AoDenoiseBilateralBlurProcess;
class DdgiRayTraceProcess;
class DdgiSampleProbeGridProcess;
class PreViewProcess;

class LocalScene : public GameScene
{
public:

	virtual void OnImgui() override;

protected:

	virtual void OnInit() override;


	virtual void OnExit() override;


	virtual void OnTick(float deltaTime) override;

	void ResetLight();

	void DirectionalLightGui();

	void PointLightGui();

	void SpotLightGui();

protected:

	CoordinateProcess* mCoordinateProcess;

	ResourceProcess* mResourceProcess;

	GBufferProcess* mGBufferProcess;

	ShadowsRayTraceProcess* mShadowsRayTraceProcess;

	ShadowsTemporalAccumulationProcess* mShadowsTemporalAccumulationProcess;

	ShadowsAtrousFilterProcess* mShadowsAtrousFilterProcess;

	AoRayTraceProcess* mAoRayTraceProcess;

	AoDenoiseBilateralBlurProcess* mAoDenoiseBilateralBlurProcess;

	AoTemporalAccumulationProcess* mAoTemporalAccumulationProcess;

	DdgiRayTraceProcess* mDdgiRayTraceProcess;

	DdgiSampleProbeGridProcess* mDdgiSampleProbeGridProcess;

	PreViewProcess* mPreViewProcess;

public:

	int32 mGBufferIndex;

	std::vector<std::string> mLightTypeNames;

	ImGuizmo::OPERATION mLightTransformOperation;
	glm::mat4           mLightTransform;
	float               mLightRadius;
	glm::vec3           mLightDirection;
	glm::vec3           mLightPosition;
	glm::vec3           mLightColor;
	float               mLightIntensity;
	float               mLightConeAngleInner;
	float               mLightConeAngleOuter;
	LightType           mLightType;

};

